package br.com.hstar.server.usuario;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import br.com.hstar.client.usuario.UsuarioService;
import br.com.hstar.client.usuario.UsuarioUI;
import br.com.hstar.client.util.HstarUserException;
import br.com.hstar.model.usuario.UsuarioDO;
import br.com.hstar.server.DozerHelper;
import br.com.hstar.server.DozerUtility;
import br.com.hstar.server.HibernateUtility;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class UsuarioServiceImpl extends RemoteServiceServlet implements UsuarioService {

	public void saveOrUpdate(UsuarioUI objUI) throws HstarUserException {
		UsuarioDO objDO = (UsuarioDO) DozerUtility.getMapper().map(objUI, UsuarioDO.class);
			
		Session sessao = HibernateUtility.getSession();
		Transaction transaction = sessao.beginTransaction();
		
		if(objUI.getId() != null) {
			sessao.update(objDO);
		} else {
			sessao.save(objDO);
		}

		transaction.commit();
		sessao.close();
	}
	
	public List listAll() {
		Session sessao = HibernateUtility.getSession();
		Criteria select = sessao.createCriteria(UsuarioDO.class);
		ArrayList objetos = (ArrayList)select.list();
		sessao.close();
		
		return DozerHelper.mapList(
				DozerUtility.getMapper(), 
				objetos, 
				UsuarioUI.class);
	}
	
	public UsuarioUI retrieveById(Long id) {
		Session sessao = HibernateUtility.getSession();
		Criteria cri = sessao.createCriteria(UsuarioDO.class);
		cri.add(Restrictions.eq("id", id));
		UsuarioDO objDO = (UsuarioDO) cri.uniqueResult();
		sessao.close();
				
		UsuarioUI objUI = (UsuarioUI) DozerUtility.getMapper().map(objDO, UsuarioUI.class);
		
	  	return objUI;
	}
	
	public void delete(Long id) {
		Session sessao = HibernateUtility.getSession();
		Transaction transaction = sessao.beginTransaction();

			Criteria cri = sessao.createCriteria(UsuarioDO.class);
			cri.add(Restrictions.eq("id", id));
			UsuarioDO objDO = (UsuarioDO) cri.uniqueResult();
			sessao.delete(objDO);

		transaction.commit();
		sessao.close();
	}
	
	public UsuarioUI login(String login, String senha) {
		Session sessao = HibernateUtility.getSession();
		Criteria cri = sessao.createCriteria(UsuarioDO.class);
		
		cri.add(Restrictions.eq("login", login));
		cri.add(Restrictions.eq("senha", senha));
		
		UsuarioDO objDO = (UsuarioDO) cri.uniqueResult();
		sessao.close();
				
		if(objDO == null) return null;
		
		UsuarioUI objUI = (UsuarioUI) DozerUtility.getMapper().map(objDO, UsuarioUI.class);
		
	  	return objUI;
	}

	public void alterarSenha(String senhaAnterior, String senhaNova, Long userID) throws HstarUserException {
		UsuarioUI user = retrieveById(userID);
		if(!user.getSenha().equals(senhaAnterior))
		{
			throw new HstarUserException("A senha atual não confere");
		}		
		user.setSenha(senhaNova);
		saveOrUpdate(user);
	}
}
